home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / misc_pto / advtutr / advent5.doc < prev    next >
Text File  |  1986-02-14  |  7KB  |  148 lines

  1.                      How to Write an Adventure
  2.                            Part 5
  3.  
  4. Object Manipulation
  5.  
  6.      Of all the things required of an Adventure program, the most fundimental 
  7. is the ability to manipulate objects in the environment. This is facilitated 
  8. by two major routines... those triggered by the verbs "GET" and "PUT".  
  9.      The L(X) array determines in what room an object is placed. If L(1)=1 
  10. then object #1 is located in Room 1 and so on. By simply changing the number 
  11. in the propper L(X) element, we can easily change the location of the object.  
  12.      Let's say you want to GET KNIFE. The command parser determines that GET 
  13. and KNIFE are both recognized words. The V value directs the program to a 
  14. particular line of the program (Say 3000) where the GET routine is located.  
  15. Let's see what happens next: 
  16.      At line 3000 we must first determine if the player is already holding the 
  17. knife. If KNIFE was noun number 7, then N (noun counter) is equal to 7. (This 
  18. was assigned in the command parser... remember?) So how do we know what the 
  19. player is holding? Well, array L(X) holds the location of the object. If we 
  20. assign the location -1 to anything being held, then there can never be any 
  21. conflicts with where other things are located, right? So that is what we do.  
  22. This means that to check and see if we are holding the object, we just have to 
  23. check and see if L(N)=-1: 
  24.      
  25.           3000 IF L(N)=-1 THEN PRINT"You already have the ";N$;".":GOTO 1000
  26.         
  27.      If the OBJECT LOCATION is not -1, the test fails, and control falls to 
  28. 3010 where we will test to see that the mentioned object can indeed be gotten. 
  29. There are some objects that are either too large to be moved, or objects that 
  30. need the presence of another object to move them. You can "filter out" these 
  31. objects with a test like the one in 3010:
  32.      
  33.           3010 IF N>28 THEN PRINT"The ";N$;" is too heavy to move.":GOTO 1000
  34.      
  35.      In this example, any noun with a count of less than 28 can actually be 
  36. picked up. All nouns that are larger than 28 are considered to heavy to move.
  37.      Next, we must check to see that the object mentioned is really in the 
  38. room with us. This is also easy to check. Our current location is contained in 
  39. variable L:
  40.      
  41.           3020 IF L(N)<>L THEN PRINT"I don't SEE the ";N$;" here.":GOTO 1000
  42.      
  43.      L(N) contains the number of the room where the object IS, and L is OUR 
  44. location.
  45.      The case will arise when the posession of one object is necessary before 
  46. another object can be gotten. The code in 3030 is an example:
  47.      
  48.           3030 IF L(19)<>-1 AND N=20 THEN PRINT"I can't do that YET!":GOTO 
  49.                    1000
  50.      
  51.      In other words, if object 19 is not being held, then object 20 cannot be 
  52. gotten. This can be turned around to check for ANYTHING, like a certain object 
  53. being in another room or the like. You can cram as many of these tests in as 
  54. you like (and have memory to accomodate!).
  55.      Finally, you come to the moment of truth... All of the tests have been 
  56. passed, and it's time to get the object:
  57.           
  58.           3040 L(N)=-1:PRINT N$;" taken.":GOTO 1000
  59.      
  60.      Pretty slick, NO?
  61.      PUTTING or DROPPING an object is even easier. The only thing you really 
  62. have to check on is, "Do I HAVE the object". If you don't, say so. If you do, 
  63. assign L(N)=L...that is...put the ojbect back into a room:
  64.      
  65.           3100 IF L(N)<>-1 THEN PRINT"You don't HAVE the ";N$:GOTO 1000
  66.           3110 L(N)=L:PRINT N$;" dropped.":GOTO 1000
  67.      
  68.      
  69.      
  70. ROOM ZERO
  71.      
  72.      There is a special room that we have not discussed yet, and this is as 
  73. good a place to talk about it as any. That is Room Zero. You never assigned a 
  74. room zero in your planning, but it is there. That is because all of your 
  75. arrays begin with the "0" subscript. This room is a "holding tank" or "staging 
  76. platform" for objects that are not needed until later in the adventure, or for 
  77. objects that must change their form. It's easy to transfer objects too and 
  78. from room Zero. Let's say that waving a wand changes a statue (N(12)) into a 
  79. princess (N(13)). After you do all your testing to be sure the wand is there 
  80. etc the code to do the change would look like this:
  81.      
  82.           3240 L(12)=0:L(13)=L:PRINT"The wand did something!":GOTO 1000
  83.      
  84.      Just swap the objects out!!!!!! This is handy also for lighting lamps and 
  85. so forth. Room Zero is also the place you send tasty food that get's eaten, or 
  86. treasures that get stollen that you never plan to return to the adventurer.
  87.      
  88.      
  89. MOVING FROM ROOM TO ROOM
  90.      
  91.      You MUST have a way to get from one room to another. Usually you GO NORTH 
  92. or whatever. The actual movement routine uses the D(X,Y) array to determine if 
  93. the requested move is legal. This routine looks like this:
  94.      
  95.           5000 IF D(N,L)<>0 THEN L=D(N,L):GOTO 1000
  96.           5010 PRINT"You cannot go in that Direction":GOTO 1000
  97.      
  98.      The D(X,Y) array contains the numbers of all the rooms that canned with 
  99. the current room, room L. If the direction is zero, then no exit exists in 
  100. that direction. If there IS an exit, then the room number in that array 
  101. element becomes the new L number.
  102.      
  103.      
  104. HELP
  105.      
  106.      Many adventures offer hints to the adventurer. This is usually handled 
  107. along the lines of "if he's in room # so and so, tell him this:
  108.      
  109.           11000 ON L GOTO 11001,11002,11003,11004:GOTO 11005
  110.           11001 PRINT"Try EXAMINING THINGS":GOTO 1000
  111.           11002 PRINT"The wall appears climbable":GOTO 1000
  112.           11003 PRINT"Leave the apples alone!":GOTO 1000
  113.           11004 PRINT"Try pushing the button":GOTO 1000
  114.           11005 PRINT"Gee, I'm as confused as you are!":GOTO 1000
  115.      
  116.      Depending on the room number, the adventurer gets a meaningful message. 
  117. If there is no helkp for a room, the routing should be to line 11005 where a 
  118. general purpose "shrug" is displayed.
  119.      
  120.      
  121. EXAMINE
  122.      
  123.      Examine is handled just like Help. It tells more about a particular 
  124. object. The only difference is, instead of keying on the room number, we must 
  125. key first on the object, and then check to see if it is
  126.      A) in the room
  127.      B) on the adventurer
  128.      Given an afirmative to either case, we display the help:
  129.      
  130.           12000 IF L(N)<>L AND L(N)<>-1 THEN PRINT "I don't see it!": GOTO
  131.                1000
  132.           12010 IF N=8 THEN PRINT"It's an old rusted key!":GOTO 1000
  133.      
  134.      
  135.      In turn, all items can be so handled, and in writing all of these 
  136. routines, the adventure is fleshed out. 
  137.      
  138.      The final chapter of our little tutoral will deal with enhancements, like 
  139. game saves, inventories, and shorthand commands.
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.